package cn.xeblog.plugin.factory;

import cn.hutool.core.annotation.AnnotationUtil;
import cn.xeblog.commons.util.ClassUtils;
import com.intellij.util.PathUtil;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 对象工厂
 *
 * @author anlingyi
 * @date 2022/8/5 7:06 上午
 */
public class ObjectFactory {
    /**
     * 通过注解注册的class集合[对象，class对象]
     */
    private final Map<Object, Class> classMap;

    /**
     * 注解Class
     */
    private final Class annotationClass;

    /**
     * 初始化对象工厂
     *
     * @param annotationClass 注解class
     */
    public ObjectFactory(Class annotationClass) {
        // 初始化属性
        this.classMap = new HashMap<>();
        this.annotationClass = annotationClass;
        init();
    }

    /**
     * 初始化
     */
    private void init() {
        // 通过GameFactory.class的类路径和注解获取相应的class对象
        Set<Class<?>> clazzSet = ClassUtils.scan(PathUtil.getJarPathForClass(GameFactory.class), null, annotationClass);
        //不为空，实例化并注册
        if (!clazzSet.isEmpty()) {
            clazzSet.forEach(clazz -> classMap.put(AnnotationUtil.getAnnotationValue(clazz, annotationClass), clazz));
        }
    }

    /**
     * 生产
     *
     * @param key 键
     * @return 不为空，获取成功，为空，没获取到
     */
    public Object produce(Object key) {
        // 通过key获取集合中的class
        Class clazz = classMap.get(key);
        // 通过反射的方式利用无参构造方法实例化对象
        if (clazz != null) {
            try {
                return clazz.getDeclaredConstructor().newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

}
